package com.weblog.weblog.web.service.impl;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.weblog.weblog.common.domain.dos.ArticleDO;
import com.weblog.weblog.common.domain.dos.ArticleTagRelDO;
import com.weblog.weblog.common.domain.dos.TagDO;
import com.weblog.weblog.common.domain.mapper.ArticleMapper;
import com.weblog.weblog.common.domain.mapper.ArticleTagRelMapper;
import com.weblog.weblog.common.domain.mapper.TagMapper;
import com.weblog.weblog.common.enums.ResponseCodeEnum;
import com.weblog.weblog.common.exception.BizException;
import com.weblog.weblog.common.utils.PageResponse;
import com.weblog.weblog.common.utils.Response;
import com.weblog.weblog.web.convert.ArticleConvert;
import com.weblog.weblog.web.model.vo.tag.FindTagArticlePageListReqVO;
import com.weblog.weblog.web.model.vo.tag.FindTagArticlePageListRspVO;
import com.weblog.weblog.web.model.vo.tag.FindTagListRspVO;
import com.weblog.weblog.web.service.TagService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author gc
 * @date 2023年10月23日 16:20
 */

@Service
@Slf4j
public class TagServiceImpl implements TagService {

    @Autowired
    private TagMapper tagMapper;
    @Autowired
    private ArticleTagRelMapper articleTagRelMapper;
    @Autowired
    private ArticleMapper articleMapper;

    /*
     * 获取标签列表
     * @author gc
     * @date 2023/10/23 16:24
     * @return com.weblog.weblog.common.utils.Response
     */
    @Override
    public Response findTagList() {
        List<TagDO> tagDOS = tagMapper.selectList(Wrappers.emptyWrapper());

        List<FindTagListRspVO> vos = null;
        if(!CollectionUtils.isEmpty(tagDOS)){
            vos = tagDOS.stream().map(tagDO -> FindTagListRspVO.builder()
                    .id(tagDO.getId())
                    .name(tagDO.getName())
                    .articlesTotal(tagDO.getArticlesTotal())
                    .build()).collect(Collectors.toList());
        }

        return Response.success(vos);
    }

    @Override
    public Response findTagPageList(FindTagArticlePageListReqVO findTagArticlePageListReqVO) {
        Long current = findTagArticlePageListReqVO.getCurrent();
        Long size = findTagArticlePageListReqVO.getSize();

        Long tagId = findTagArticlePageListReqVO.getId();

        TagDO tagDO = tagMapper.selectById(tagId);
        if(Objects.isNull(tagDO)){
            log.warn("==> 改标签不存在 ， tagID : {}",tagId);
            throw new BizException(ResponseCodeEnum.TAG_NOT_EXISTED);
        }

        //标签下所有文章
        List<ArticleTagRelDO> articleTagRelDOS = articleTagRelMapper.selectByTagId(tagId);

        if(CollectionUtils.isEmpty(articleTagRelDOS)){
            log.warn("==> 改标签下还为发布任何文章, tagId: {}" , tagId);
            return PageResponse.success(null,null);
        }

        List<Long> articleIds = articleTagRelDOS.stream().map(ArticleTagRelDO::getArticleId).collect(Collectors.toList());

        Page<ArticleDO> page = articleMapper.selectPageListByArticleIds(current, size, articleIds);
        List<ArticleDO> articleDOS = page.getRecords();

        //DO -> VO
        List<FindTagArticlePageListRspVO> vos = null;
        if(!CollectionUtils.isEmpty(articleDOS)){
            vos = articleDOS.stream()
                    .map(ArticleConvert.INSTANCE::convertDO2TagArticleVO)
                    .collect(Collectors.toList());
        }
        return PageResponse.success(page,vos);
    }
}
